﻿//#include <iostream>
//#include<functional>
//using namespace std;
//
//int Sub(int a, int b)
//{
//	return a - b;
//}
//
//class Plus
//{
//public:
//	static int plusi(int a, int b)
//	{
//		return a + b;
//	}
//
//	double plusd(double a, double b)
//	{
//		return a - b;
//	}
//};
//
//int main()
//{
//	//调整参数顺序，了解一下，意义不大
//	int x = 10, y = 20;
//	cout << Sub(x, y) << endl;
//
//	auto f1 = bind(Sub, placeholders::_2, placeholders::_1);
//	cout << f1(x, y) << endl;
//
//	function<double(Plus, double, double)> fc3 = &Plus::plusd;
//	cout << fc3(Plus(), 1, 1) << endl;
//
//	//调整参数的个数
//	//某些参数绑死
//	Plus p;
//	function<double(double, double)> fc4 = bind(&Plus::plusd, p, placeholders::_1, placeholders::_2);
//	cout << fc4(2, 3) << endl;
//
//	function<double(double)> fc5 = bind(&Plus::plusd, Plus(), placeholders::_1, 20);
//	cout << fc5(2) << endl;
//
//	//类的静态成员函数绑定
//	auto fc6 = bind(Plus::plusi, 10, 20); //静态成员不属于任何类，无需指名具体对象
////function<int(int, int)>fc6 = bind(Plus::plusi, 5, 7);参数全部指定，此时不能使用function
//	cout << fc6() << endl;
//	return 0;
//}
//

//#include<iostream>
//#include<string>
//using namespace std;
//
//double Division(int a, int b)
//{
//	if (b == 0)
//		throw "Division by zero condition!"; //给catch返回const char*型数据
//	else if (a == 0)
//		throw 0; //给catch返回int型数据
//	else if (a % 2 == 0)
//	{
//		string s("质数");
//		throw s; //抛局部对象，返回的是s的值拷贝
//	}
//	else
//		return ((double)a / (double)b);
//}
//int main()
//{
//	try 
//	{
//		int a = 0, b = 0;
//		cout << "请输入a和b: ";
//		cin >> a >> b;
//		cout << Division(a, b) << endl;
//	}
//		catch (const char* errmsg)
//	{
//		cout << errmsg << endl;
//	}
//	catch (int x)
//	{
//		cout << "捕获异常:" << x << endl;
//	}
//	catch (...)
//	{
//		cout << "未知异常" << endl;
//	}
//
//	//catch处理后，下面的代码依然被执行
//	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//void fxx()
//{
//	int i = 0;
//	cin >> i;
//	if (i % 2 == 0)
//	{
//		throw 1.5;
//	}
//	if (i % 3 == 0)
//	{
//		throw 1;
//	}
//}
//void Func()
//{
//	try
//	{
//		fxx();
//	}
//	/*若上面的throw抛异常数据或对象是整型类型，会被下面的catch捕获，若不是整型类型，
//	将会往上一层（即main函数，因为main函数调用的此函数）查看catch，直到满足匹配为止，
//	若到了main仍没有匹配的，则终止程序*/
//	catch (int x) //注意: catch这里不会进行类型转换，即当throw抛出浮点型也不会被下面catch整型捕获，这里严格按照类型机制捕获
//	{
//		cout << __LINE__ << "捕获异常:" << x << endl;
//	}
//	//此调用栈的catch后，下面的代码依然会被调用
//	cout << "=====================" << endl;
//}
//
//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (int x)
//	{
//		cout << __LINE__ << "main函数整型int捕获异常: " << x << endl;
//	}
//	catch (float x)
//	{
//		cout << "main函数浮点型float捕获异常: " << x << endl;
//	}
//	catch (...)
//	{
//		cout << "未知异常" << endl;
//	}
//	cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
//	return 0;
//}

//#include<iostream>
//#include<windows.h>
//using namespace std;
////服务器开发中通常使用的异常继承体系
//class Exception
//{
//public:
//	Exception(const string& errmsg, int id)
//		:_errmsg(errmsg)
//		, _id(id)
//	{	}
//	//what函数返回异常原因
//	virtual string what() const
//	{
//		return _errmsg;
//	}
//protected:
//	string _errmsg;  //实际运用中的错误描述
//	int _id;         //实际运用中的错误编号，即具体是哪个人的错误
//};
////继承和多态
//class SqlException : public Exception
//{
//public:
//	SqlException(const string& errmsg, int id, const string& sql)
//		:Exception(errmsg, id)
//		, _sql(sql)
//	{	}
//	//what函数返回异常原因
//	virtual string what() const
//	{
//		string str = "SqlException:";
//		str += _errmsg;
//		str += "->";
//		str += _sql;
//		return str;
//	}
//private:
//	const string _sql;
//};
//class CacheException : public Exception
//{
//public:
//	CacheException(const string& errmsg, int id)
//		:Exception(errmsg, id)
//	{	}
//	//what函数返回异常原因
//	virtual string what() const
//	{
//		string str = "CacheException:";
//		str += _errmsg;
//		return str;
//	}
//};
//class HttpServerException : public Exception
//{
//public:
//	HttpServerException(const string& errmsg, int id, const string& type)
//		:Exception(errmsg, id)
//		, _type(type)
//	{	}
//	//what函数返回异常原因
//	virtual string what() const
//	{
//		string str = "HttpServerException:";
//		str += _type;
//		str += ":";
//		str += _errmsg;
//		return str;
//	}
//private:
//	const string _type;
//};
//
//void SQLMgr()
//{
//	srand(time(0));
//	if (rand() % 7 == 0)
//	{
//		throw SqlException("权限不足", 100, "select * from name = '张三'"); //抛出派生类匿名对象
//	}
//	cout << "!!!!!!!!!!!!!!!!!!!!!!!!运行成功" << endl;
//}
//void CacheMgr()
//{
//	srand(time(0));
//	if (rand() % 5 == 0)
//	{
//		throw CacheException("权限不足", 100); //抛出派生类匿名对象
//	}
//	else if (rand() % 6 == 0)
//	{
//		throw CacheException("数据不存在", 101); //抛出派生类匿名对象
//	}
//	SQLMgr();
//}
//void HttpServer()
//{
//	srand(time(0));
//	if (rand() % 3 == 0)
//	{
//		throw HttpServerException("请求资源不存在", 100, "get"); //抛出派生类匿名对象
//	}
//	else if (rand() % 4 == 0)
//	{
//		throw HttpServerException("权限不足", 101, "post"); //抛出派生类匿名对象
//	}
//	CacheMgr();
//}
//
//int main()
//{
//	srand(time(0));
//	while (1)
//	{
//		Sleep(1000);
//		try {
//			HttpServer();
//		}
//		catch (const Exception& e) //上面throw抛出派生类匿名对象，这里捕获父类对象就可以
//		{
//			//多态输出具体异常
//			cout << e.what() << endl;
//		}
//		catch (...)
//		{
//			cout << "Unkown Exception" << endl;
//		}
//	}
//	return 0;
//}